﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using myFinance.Models;
using myFinance.BLL;
using System.Data;

namespace Testes.BLL
{
    [TestClass]
    public class GrupoDespesaTeste
    {
        static int idGD; // id do grupo de despesa
        static int idSGD; // id do sub grupo de despesa

        [TestMethod]
        public void AddGrupoDespesa()
        {
            if (idGD > 0)
            {
                return;
            }
			var gd = new GrupoDespesa();
			gd.Nome = "Teste Grupo Despesa";
			gd.PessoaId = 1;            

			Assert.AreEqual(GrupoDespesaBll.Add(gd), true);

            idGD = gd.Id;
        }

        [TestMethod]
        public void AddSubGrupoDespesa()
        {
            if (idGD == 0)
            {
                AddGrupoDespesa();
            }

            if (idSGD > 0)
            {
                return;
            }

            var sgd = new SubGrupoDespesa();
            sgd.GrupoDespesaId = idGD;
            sgd.Nome = "Teste Sub Grupo Despesa";
            
            Assert.AreEqual(SubGrupoDespesaBll.Add(sgd), true);

            idSGD = sgd.Id;
        }

        [TestMethod]
        public void EditGrupoDespesa()
        {
            if (idGD == 0)
            {
                AddGrupoDespesa();
            }
            var gd = GrupoDespesaBll.GetGrupoDespesa(idGD, "admin");
            gd.Nome = "Teste 2";
            gd.PessoaId = 1;

            Assert.AreEqual(GrupoDespesaBll.Edit(gd), true);
        }

        [TestMethod]
        public void EditSubGrupoDespesa()
        {
            if (idSGD == 0)
            {
                AddSubGrupoDespesa();
            }

            var sgd = SubGrupoDespesaBll.GetSubGrupoDespesa(idSGD, "admin");
            sgd.Nome = "Teste de Sub Grupo 2";

            Assert.AreEqual(SubGrupoDespesaBll.Edit(sgd), true);
        }

        [TestMethod]
        [ExpectedException(typeof(UpdateException))]
        public void DelGrupoDespesaFalha()
        {
            if (idGD == 0)
            {
                EditGrupoDespesa();
            }
            
            Assert.AreEqual(GrupoDespesaBll.Delete(idGD), true); // não pode excluir por causa da integridade da chave estrangeira
        }

        [TestMethod]
        public void DelGrupoDespesaSucesso()
        {
            if (idSGD == 0)
            {
                EditSubGrupoDespesa();
            }
            var excluiuSGD = SubGrupoDespesaBll.Delete(idSGD);
            Assert.AreEqual(excluiuSGD, true); // tem q passar
            
            Assert.AreEqual(GrupoDespesaBll.Delete(idGD), true); // agora sim, tem q passar
        }
    }
}
